OBJS=server.o iothreadpool.o connection.o ae.o ae_epoll.o parseHttpMessage.o
CXXFLAGS=-std=c++11 -g -lpthread -L./Common -I./Common -lcommon -llog4cxx -DCUR_CACHE
CXX=g++
ALL_TARGETS=serverMain

#替换文件，将OBJSz中的所有.o文件替换对应.%.d文件 OBJS:%.o表示获得OBJS变量中的所有.o文件
#.d 文件记录了 .cpp 文件与其依赖的头文件之间的关系
DESP=$(OBJS:%.o=.%.d)

all:debug $(ALL_TARGETS)

#将所有 .d 文件的规则合并到主 Makefile 中。
#include 与依赖文件（.d 文件）的关系
#	若存在：读取内容，将依赖规则合并到当前 Makefile 中。
#	若 .d 文件不存在，Make 会尝试根据规则生成它
include $(DESP)

$(ALL_TARGETS):$(OBJS)
	$(CXX) $(OBJS) -o $@ $(CXXFLAGS)

$(OBJS):%.o:%.cpp
	$(CXX) -c $< -o $@ $(CXXFLAGS)


# $(DESP):.%.d：是 Makefile 中的 模式规则，用于匹配并处理 $(DESP) 变量中所有以 .d 结尾的文件。
# @表示不打印命令本身，只显示结果
# -M 编译器选项，只生成依赖关系，不编译代码
# > 重定向符号，将依赖关系输出到 .d文件中
# $< cpp文件 	$@ 目标文件.d文件
$(DESP):.%.d:%.cpp
	@$(CXX) -M $(CXXFLAGS) $< > $@



#$(MAKE)表示make命令
#make -C 切换到指定工作目录执行make
#|| exit 1：子目录执行make失败 返回非0，终止整个构建
ALL_DIR=./Common
debug:
	@for dir in $(ALL_DIR); \
	do \
		$(MAKE) -C $$dir || exit 1; \
	done

.PHONY:clean
clean:subclean curclean

#$(MAKE) -C $$dir clean; \  在子目录执行make clean
subclean:
	@for dir in $(ALL_DIR); \
	do \
		$(MAKE) -C $$dir clean; \
	done 

curclean:
	rm -rf $(ALL_TARGETS) $(OBJS)
	rm -rf .*.d